"""
回调接收服务器
用于接收部署服务的回调信息
监听端口：10001
"""

from flask import Flask, request, jsonify
from flask_cors import CORS
import json
from datetime import datetime

app = Flask(__name__)
CORS(app)

# 存储回调历史记录
callback_history = []


def log_callback(route, data):
    """记录回调信息到历史记录"""
    callback_record = {
        'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        'route': route,
        'data': data
    }
    callback_history.append(callback_record)
    # 只保留最近100条记录
    if len(callback_history) > 100:
        callback_history.pop(0)
    
    # 打印回调信息
    print(f"\n{'='*60}")
    print(f"📥 收到回调 [{route}]")
    print(f"⏰ 时间: {callback_record['timestamp']}")
    print(f"📋 数据:")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    print(f"{'='*60}\n")


@app.route('/callback/numeric/deploy/start/', methods=['POST'])
def callback_start():
    """
    接收启动服务的回调
    """
    try:
        data = request.get_json()
        if data is None:
            return jsonify({
                'status': 400,
                'message': '请求数据格式错误，需要JSON格式'
            }), 400
        
        log_callback('start', data)
        
        # 这里可以添加处理启动回调的业务逻辑
        # 例如：更新数据库、发送通知等
        
        return jsonify({
            'status': 200,
            'message': '启动回调接收成功',
            'received_data': data
        }), 200
        
    except Exception as e:
        print(f"❌ 处理启动回调时出错: {e}")
        return jsonify({
            'status': 500,
            'message': f'处理回调时出错: {str(e)}'
        }), 500


@app.route('/callback/numeric/deploy/stop/', methods=['POST'])
def callback_stop():
    """
    接收停止服务的回调
    """
    try:
        data = request.get_json()
        if data is None:
            return jsonify({
                'status': 400,
                'message': '请求数据格式错误，需要JSON格式'
            }), 400
        
        log_callback('stop', data)
        
        # 这里可以添加处理停止回调的业务逻辑
        # 例如：更新数据库、释放资源等
        
        return jsonify({
            'status': 200,
            'message': '停止回调接收成功',
            'received_data': data
        }), 200
        
    except Exception as e:
        print(f"❌ 处理停止回调时出错: {e}")
        return jsonify({
            'status': 500,
            'message': f'处理回调时出错: {str(e)}'
        }), 500


@app.route('/callback/numeric/deploy/remove/', methods=['POST'])
def callback_remove():
    """
    接收删除服务的回调
    """
    try:
        data = request.get_json()
        if data is None:
            return jsonify({
                'status': 400,
                'message': '请求数据格式错误，需要JSON格式'
            }), 400
        
        log_callback('remove', data)
        
        # 这里可以添加处理删除回调的业务逻辑
        # 例如：清理数据库记录、删除相关文件等
        
        return jsonify({
            'status': 200,
            'message': '删除回调接收成功',
            'received_data': data
        }), 200
        
    except Exception as e:
        print(f"❌ 处理删除回调时出错: {e}")
        return jsonify({
            'status': 500,
            'message': f'处理回调时出错: {str(e)}'
        }), 500


@app.route('/callback/history', methods=['GET'])
def get_callback_history():
    """
    获取回调历史记录（可选功能）
    """
    limit = request.args.get('limit', 50, type=int)
    return jsonify({
        'status': 200,
        'message': '获取回调历史成功',
        'total': len(callback_history),
        'data': callback_history[-limit:]
    }), 200


@app.route('/health', methods=['GET'])
def health_check():
    """
    健康检查接口
    """
    return jsonify({
        'status': 200,
        'message': '回调服务器运行正常',
        'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    }), 200


if __name__ == '__main__':
    print("🚀 启动回调接收服务器...")
    print("📡 监听地址: http://localhost:10001")
    print("📋 可用路由:")
    print("   - POST /callback/numeric/deploy/start/   (启动回调)")
    print("   - POST /callback/numeric/deploy/stop/    (停止回调)")
    print("   - POST /callback/numeric/deploy/remove/  (删除回调)")
    print("   - GET  /callback/history                 (查看历史)")
    print("   - GET  /health                            (健康检查)")
    print("="*60)
    
    app.run(host='localhost', port=10001, debug=True)

